如何在没有事务的情况下将实体保存到数据库中?
How is the entity being saved to the database without a transaction?
我可以在 Spring 启动应用程序中保存没有 @Transactional
的实体。我只注意到这一点,因为我无法更新实体,直到我将 @Transactional
添加到 EmployeeService.java
.
中的 save
方法
我没有在 class 级别注释 @Transactional
。它唯一被发现的地方是我的服务层中不属于 save
方法的方法。我的 EmployeeDAO
没有扩展 JPARepository
。它用 @Repository
注释。我有 spring-boot-starter-data-jpa
作为依赖项。我也没有手动开始或提交交易。
EmployeeRestController.java
@PostMapping("/employees")
public void addEmployee(@RequestBody Employee employee) {
employee.setId(0);
employeeService.save(employee);
}
EmployeeService.java
public void save(Employee employee) {
emplDAO.save(employee);
}
EmployeeDAO.java
@Override
public void save(Employee employee) {
Session currentSession = em.unwrap(Session.class);
currentSession.saveOrUpdate(employee);
}
默认情况下 Spring 启动 Web 应用程序 spring.jpa.open-in-view
设置为 true
。
很有可能是这个原因
来自Spring Boot Reference Guide:
If you are running a web application, Spring Boot by default registers OpenEntityManagerInViewInterceptor
to apply the “Open EntityManager in View” pattern, to allow for lazy loading in web views. If you do not want this behavior, you should set spring.jpa.open-in-view
to false
in your application.properties
.
另见:
我可以在 Spring 启动应用程序中保存没有 @Transactional
的实体。我只注意到这一点,因为我无法更新实体,直到我将 @Transactional
添加到 EmployeeService.java
.
save
方法
我没有在 class 级别注释 @Transactional
。它唯一被发现的地方是我的服务层中不属于 save
方法的方法。我的 EmployeeDAO
没有扩展 JPARepository
。它用 @Repository
注释。我有 spring-boot-starter-data-jpa
作为依赖项。我也没有手动开始或提交交易。
EmployeeRestController.java
@PostMapping("/employees")
public void addEmployee(@RequestBody Employee employee) {
employee.setId(0);
employeeService.save(employee);
}
EmployeeService.java
public void save(Employee employee) {
emplDAO.save(employee);
}
EmployeeDAO.java
@Override
public void save(Employee employee) {
Session currentSession = em.unwrap(Session.class);
currentSession.saveOrUpdate(employee);
}
默认情况下 Spring 启动 Web 应用程序 spring.jpa.open-in-view
设置为 true
。
很有可能是这个原因
来自Spring Boot Reference Guide:
If you are running a web application, Spring Boot by default registers
OpenEntityManagerInViewInterceptor
to apply the “Open EntityManager in View” pattern, to allow for lazy loading in web views. If you do not want this behavior, you should setspring.jpa.open-in-view
tofalse
in yourapplication.properties
.
另见: